package com.hy.eatinghelper.quickopen.base;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.LinearLayout;

/**
 * Created by huyin on 2017/8/7.
 */

public class BaseDividerItemDecoration extends RecyclerView.ItemDecoration {
     public static final int HORIZONTAL = LinearLayout.HORIZONTAL;
     public static final int VERTICAL = LinearLayout.VERTICAL;

     private static final int[] ATTRS = new int[]{android.R.attr.listDivider};

     private Drawable mDivider;

     private int mOrientation;

     private final Rect mBounds = new Rect();

     public BaseDividerItemDecoration(Context context, int orientation) {
          final TypedArray a = context.obtainStyledAttributes(ATTRS);
          mDivider = a.getDrawable(0);
          a.recycle();
          setOrientation(orientation);
     }

     public void setOrientation(int orientation) {
          if (orientation != HORIZONTAL && orientation != VERTICAL) {
               throw new IllegalArgumentException(
                         "Invalid orientation. It should be either HORIZONTAL or VERTICAL");
          }
          mOrientation = orientation;
     }

     public void setDrawable(@NonNull Drawable drawable) {
          if (drawable == null) {
               throw new IllegalArgumentException("Drawable cannot be null.");
          }
          mDivider = drawable;
     }

     @Override
     public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
          if (parent.getLayoutManager() == null) {
               return;
          }
          if (mOrientation == VERTICAL) {
               drawVertical(c, parent);
          } else {
               drawHorizontal(c, parent);
          }
     }

     @SuppressLint("NewApi")
     private void drawVertical(Canvas canvas, RecyclerView parent) {
          canvas.save();
          final int left;
          final int right;
          if (parent.getClipToPadding()) {
               left = parent.getPaddingLeft();
               right = parent.getWidth() - parent.getPaddingRight();
               canvas.clipRect(left, parent.getPaddingTop(), right,
                         parent.getHeight() - parent.getPaddingBottom());
          } else {
               left = 0;
               right = parent.getWidth();
          }

          final int childCount = parent.getChildCount();
          /**
           * 根据系统自带
           *
           * 更改 childCount - 1
           */
          for (int i = 0; i < childCount - 1; i++) {
               final View child = parent.getChildAt(i);
               parent.getDecoratedBoundsWithMargins(child, mBounds);
               final int bottom = mBounds.bottom + Math.round(child.getTranslationY());
               final int top = bottom - mDivider.getIntrinsicHeight();
               mDivider.setBounds(left, top, right, bottom);
               mDivider.draw(canvas);
          }
          canvas.restore();
     }

     @SuppressLint("NewApi")
     private void drawHorizontal(Canvas canvas, RecyclerView parent) {
          canvas.save();
          final int top;
          final int bottom;
          if (parent.getClipToPadding()) {
               top = parent.getPaddingTop();
               bottom = parent.getHeight() - parent.getPaddingBottom();
               canvas.clipRect(parent.getPaddingLeft(), top,
                         parent.getWidth() - parent.getPaddingRight(), bottom);
          } else {
               top = 0;
               bottom = parent.getHeight();
          }

          final int childCount = parent.getChildCount();
          for (int i = 0; i < childCount; i++) {
               final View child = parent.getChildAt(i);
               parent.getLayoutManager().getDecoratedBoundsWithMargins(child, mBounds);
               final int right = mBounds.right + Math.round(child.getTranslationX());
               final int left = right - mDivider.getIntrinsicWidth();
               mDivider.setBounds(left, top, right, bottom);
               mDivider.draw(canvas);
          }
          canvas.restore();
     }

     @Override
     public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
                                RecyclerView.State state) {
          if (mOrientation == VERTICAL) {
               outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
          } else {
               outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
          }
     }
}
